import java.util.Scanner;

public class demo {

    //    有一种兔子，从出生后第3个月起每个月都生一只兔子，小兔子长到第三个月后每个月又生一只兔子。
//例子：假设一只兔子第3个月出生，那么它第5个月开始会每个月生一只兔子。
//一月的时候有一只兔子，假如兔子都不死，问第n个月的兔子总数为多少？
//    可以通过画图来找规律   △表示可以生 ○表示还不行生
//1    ○
//1   ○
//2    △                                                     ○
//3    △                        ○                           ○
//5    △              ○        ○                            △           ○
//8    △      ○      ○         △           ○               △  ○        ○
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {//在控制台停止使用Ctrl+z   在idea中使用Ctrl+d
            int month = in.nextInt();
            System.out.println(sum(month));
        }
    }
    public static int sum(int month) {
        int first = 1;
        int second = 1;
        int sum = 1;
        for (int i = 3; i <= month; i++) {
            sum = first + second;
            first = second;
            second = sum;
        }
        return sum;
    }






    //    字符串通配符△
//问题描述：在计算机中，通配符一种特殊语法，广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。
//要求：
//实现如下2个通配符：
//*：匹配0个或以上的字符（注：能被*和?匹配的字符仅由英文字母和数字0到9组成，下同）
//？：匹配1个字符
//注意：匹配时不区分大小写。
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String t = in.next();//有通配符字符串
            String str = in.next();//字符串
            System.out.println(match(t,str));
        }
    }

    public static boolean match(String t, String str) {
        char[] tc = t.toCharArray();//有通配符字符数组
        char[] strc = str.toCharArray();//没有通配符的字符数组
        int tlen = tc.length;
        int strlen = strc.length;
        boolean[][] arr = new boolean[strlen+1][tlen+1];//数组长度要个加1 方便后面的判断
        arr[0][0] = true;//第一个一定设为true
//
//                  t  c         横项表示有通配符的
//              s
//              t
//              r
//              c
//        竖向表示没有通配符的
        for(int i=0; i<=strlen; i++) {
            for(int j=1; j<=tlen; j++) {
                if(tc[j-1]=='*') {//遇到'*'
                    if(i==0) {//第一行的情况
//                        如果遇到'*' 那么要去 该数组位置的左边和上边的   (||或起来)   情况
//                        因为这里是第一行 所以只要该位置的左边情况就可以了
                        arr[0][j] = arr[0][j-1];
                    }else {//其他行情况
                        if(strc[i-1]=='.' ||
                                (strc[i-1]>='a'&&strc[i-1]<='z') ||
                                (strc[i-1]>='A'&&strc[i-1]<='Z') ||
                                (strc[i-1]>='0'&&strc[i-1]<='9')) {
                            //  数组默认创建是false 因为第一列除了第一个都是false
                            //  所以j从1开始就可以
                            //  这里就是取该数组位置的左边和上边的  (||或起来)  的情况
                            arr[i][j] = arr[i-1][j] || arr[i][j-1];
                        }
                    }
                }else {//不是*的情况
                    // 这里要注意i==0时  因为arr数组创建默认是false了
                    //所以可以不用在去调用i==0 的情况 所以我们从i==1开始
                    if(i>0 && defs(strc[i-1], tc[j-1])) {//这里我们定义defs方法判断strc[i-1],tc[j-1]是否匹配的上
                        //如果进来就说明 字符匹配上了 但是我们还是要确认 该字符之前的字符有没有匹配上
                        //就是判断该位置左上方位置的情况
                        arr[i][j] = arr[i-1][j-1];
                    }
                }
            }
        }
        // 最后返回最后一个数组就可以了
        return arr[strlen][tlen];
    }

    // 判断两个字符是否匹配  不区分大小写
    public static boolean defs(char strc, char tc) {
        //当strc为 ? 时
        if(tc == '?') return true;
        // 如果是小写字符 我们这样将其装换成大写字符   加减之后要记得类型转换
        if(strc>='a' && strc<='z') {
            strc = (char)(strc-'a'+'A');
        }
        if(tc>='a' && tc<='z') {
            tc = (char)(tc-'a'+'A');
        }
        return strc==tc;
    }


}
